package pe.com.csi.pm.regexiv.dao;

import java.util.ArrayList;
import java.util.List;

import pe.com.csi.pm.regexiv.bean.DElementoVial;
import pe.com.csi.pm.regexiv.bean.ElementoVial;

import pe.com.csi.pm.regexiv.db.DaoManager;
import pe.com.csi.pm.regexiv.interfaces.ElementoVialDAO;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;

public class ElementoVialDAOImpl implements ElementoVialDAO {

	private Context context;

	public ElementoVialDAOImpl(Context context) {
		this.context = context;
	}

	@Override
	public int registrar(ElementoVial elemento) {

		int rows = 0;
		DaoManager usdbh = new DaoManager(context);
		SQLiteDatabase db = usdbh.getWritableDatabase();
		try {

			db.beginTransaction();
			ContentValues valores = new ContentValues();
			valores.put("NUMERORTA", elemento.getNumeroRta());
			valores.put("IDTMO", elemento.getIdTmo());
			valores.put("IDCCES", elemento.getIdCces());
			valores.put("IDTPOEV", elemento.getIdTpoEv());
			valores.put("IDGPOEV", elemento.getIdGpoEV());
			valores.put("TIPOELEV", elemento.getTipoElev());
			valores.put("OBSERVACION", elemento.getObservacion());
			valores.put("PROGRESIVAINIELEV", elemento.getProgresivaIniElev());
			valores.put("PROGRESIVAFINELEV", elemento.getProgresivaFinElev());
			valores.put("LATITUDINIELEV", elemento.getLatitudinielev());
			valores.put("LATITUDFINELEV", elemento.getLatitudfinelev());
			valores.put("LONGITUDINIELEV", elemento.getLongitudinielev());
			valores.put("LONGITUDFINELEV", elemento.getLongitudfinelev());
			valores.put("LADOELEV", elemento.getLadoelev());
			valores.put("CLASIFICACIONELEV", elemento.getClasificacionelev());
			valores.put("FECHAALTAELEV", elemento.getFechaaltaelev());
			valores.put("ESTADOELEV", elemento.getEstadoelev() == null ? 1L : elemento.getEstadoelev());
			valores.put("VALORDIN1ELEV", elemento.getValordin1elev());
			valores.put("VALORDIN2ELEV", elemento.getValordin2elev());
			valores.put("VALORDIN3ELEV", elemento.getValordin3elev());
			valores.put("VALORDIN4ELEV", elemento.getValordin4elev());
			valores.put("VALORDIN5ELEV", elemento.getValordin5elev());

			long pos = db.insert("ELEMENTO_VIAL", null, valores);

			System.out.println("REGISTRADO ELEMENTO_VIAL " + pos);
			if (pos == -1) {
				rows = 0;
			} else {
				rows = (int) pos;
				// rows = 1;
			}
			db.setTransactionSuccessful();

		} catch (SQLException e) {
			rows = 0;
			e.printStackTrace();
		} finally {
			db.endTransaction();
			db.close();
		}

		return rows;
	}

	@Override
	public int registrarDetalle(ElementoVial elemento, DElementoVial delemento) {
		DaoManager usdbhd = new DaoManager(context);
		SQLiteDatabase dbd = usdbhd.getWritableDatabase();
		int rows = 0;
		try {
			dbd.beginTransaction();
			ContentValues valores = new ContentValues();

			System.out.println("entro a registrar delemento");

			valores.put("IDELEV", elemento.getIdElev());

			valores.put("ANCHOD", delemento.getAnchoD() == null ? null : delemento.getAnchoD());
			valores.put("ANCHOI", delemento.getAnchoI() == null ? null : delemento.getAnchoI());
			valores.put("ESTRUCTURAD", delemento.getEstructuraD() == null ? "" : delemento.getEstructuraD());
			valores.put("ESTRUCTURAI", delemento.getEstructuraI() == null ? "" : delemento.getEstructuraI());
			valores.put("TIPO1D", delemento.getTipo1D() == null ? "" : delemento.getTipo1D());
			valores.put("TIPO2D", delemento.getTipo2D() == null ? "" : delemento.getTipo2D());
			valores.put("TIPO3D", delemento.getTipo3D() == null ? "" : delemento.getTipo3D());
			valores.put("TIPO4", delemento.getTipo4() == null ? "" : delemento.getTipo4());
			valores.put("ESPESOR1D", delemento.getEspesor1D() == null ? "" : delemento.getEspesor1D());
			valores.put("ESPESOR2D", delemento.getEspesor2D() == null ? "" : delemento.getEspesor2D());
			valores.put("ESPESOR3D", delemento.getEspesor3D() == null ? "" : delemento.getEspesor3D());
			valores.put("ESPESOR4", delemento.getEspesor4() == null ? "" : delemento.getEspesor4());
			valores.put("MODO1D", delemento.getModo1D() == null ? "" : delemento.getModo1D());
			valores.put("MODO2D", delemento.getModor2D() == null ? "" : delemento.getModor2D());
			valores.put("MODO3D", delemento.getModo3D() == null ? "" : delemento.getModo3D());
			valores.put("MODO4", delemento.getModo4() == null ? "" : delemento.getModo4());
			valores.put("TIPO1I", delemento.getTipo1I() == null ? "" : delemento.getTipo1I());
			valores.put("TIPO2I", delemento.getTipo2I() == null ? "" : delemento.getTipo2I());
			valores.put("TIPO3I", delemento.getTipo3I() == null ? "" : delemento.getTipo3I());
			valores.put("ESPESOR1I", delemento.getEspesor1I() == null ? "" : delemento.getEspesor1I());
			valores.put("ESPESOR2I", delemento.getEspesor2I() == null ? "" : delemento.getEspesor2I());
			valores.put("ESPESOR3I", delemento.getEspesor3I() == null ? "" : delemento.getEspesor3I());
			valores.put("MODO1I", delemento.getModo1I() == null ? "" : delemento.getModo1I());
			valores.put("MODO2I", delemento.getModor2I() == null ? "" : delemento.getModor2I());
			valores.put("MODO3I", delemento.getModo3I() == null ? "" : delemento.getModo3I());

			long pos2 = dbd.insert("DELEMENTO_VIAL", null, valores);

			System.out.println("REGISTRADO DETALLE_ELEMENTO_VIAL " + pos2);
			if (pos2 == -1) {
				rows = 0;
			} else {
				rows = (int) pos2;
				// rows = 1;
			}

			dbd.setTransactionSuccessful();

		} catch (SQLException e) {
			rows = 0;
			e.printStackTrace();
		} finally {
			dbd.endTransaction();
			dbd.close();
		}

		return rows;
	}

	@Override
	public Long obtenerElementoVial() {
		Long idelemento = null;
		try {
			String sql = "SELECT MAX(IDELEV) FROM ELEMENTO_VIAL ";
			DaoManager usdbh = new DaoManager(context);
			SQLiteDatabase db = usdbh.getReadableDatabase();

			Cursor c = db.rawQuery(sql, null);
			if (c.moveToFirst()) {
				do {
					idelemento = !c.isNull(0) ? c.getLong(0) : 0;
				} while (c.moveToNext());
			}

			c.close();
			db.close();
		} catch (Exception e) {
			e.printStackTrace();

		}

		System.out.println("Idmax:" + idelemento);
		return idelemento;

	}

	@Override
	public List<ElementoVial> listarElementos(ElementoVial e) {
		List<ElementoVial> listaElementos = new ArrayList<ElementoVial>();
		try {
			String sql = "SELECT E.IDELEV , E.NUMERORTA, E.IDTMO , E.IDCCES, E.IDTPOEV, E.PROGRESIVAINIELEV, E.PROGRESIVAFINELEV, "
					+ "E.LATITUDINIELEV , E.LATITUDFINELEV , E.LONGITUDINIELEV, E.LONGITUDFINELEV , E.FECHAALTAELEV , E.LADOELEV , E.CLASIFICACIONELEV , "
					+ "E.OBSERVACION , E.ESTADOELEV , E.VALORDIN1ELEV , E.VALORDIN2ELEV ,E.VALORDIN3ELEV ,E.VALORDIN4ELEV , E.VALORDIN5ELEV ,T.NOMBRETMO " + "FROM ELEMENTO_VIAL E "
					+ "INNER JOIN TRAMO T ON (E.IDTMO = T.IDTMO) ";
			String where = " WHERE 1=1 ";
			String orderBy = " ORDER BY E.IDTPOEV, E.PROGRESIVAINIELEV, E.PROGRESIVAINIELEV ";

			if (e != null) {
				if (e.getIdTpoEv() != null && e.getIdTpoEv() > 0) {
					where += " AND E.IDTPOEV = " + e.getIdTpoEv();
				}
				if (e.getIdTmo() != null && e.getIdTmo() > 0) {
					where += " AND E.IDTMO = " + e.getIdTmo();
				}

				if (e.getProgresivaIniElev() != null && e.getProgresivaFinElev() != null) {
					where += " AND (E.PROGRESIVAINIELEV BETWEEN " + e.getProgresivaIniElev() + " AND " + e.getProgresivaFinElev() + ") ";

				} else if (e.getProgresivaIniElev() != null && e.getProgresivaFinElev() == null) {
					where += " AND E.PROGRESIVAINIELEV >= " + e.getProgresivaIniElev();

				} else if (e.getProgresivaFinElev() != null && e.getProgresivaIniElev() == null) {
					where += " AND E.PROGRESIVAFINELEV <= " + e.getProgresivaIniElev();
				}
			}
			sql = sql + where + orderBy;
			System.out.println("SQL EVENTOS \n" + sql);
			DaoManager usdbh = new DaoManager(context);
			SQLiteDatabase db = usdbh.getReadableDatabase();
			Cursor c = db.rawQuery(sql, null);
			ElementoVial elemento;
			if (c.moveToFirst()) {
				do {
					Long idEv = !c.isNull(0) ? c.getLong(0) : 0;
					// String idDipEven = !c.isNull(1) ? c.getString(1) : "";
					Long numeroRuta = !c.isNull(1) ? c.getLong(1) : 0;
					Long idTmo = !c.isNull(2) ? c.getLong(2) : 0;
					Long idCces = !c.isNull(3) ? c.getLong(3) : 0;
					Long tipo = !c.isNull(4) ? c.getLong(4) : 0;
					Double progI = !c.isNull(5) ? c.getDouble(5) : 0;
					Double progF = !c.isNull(6) ? c.getDouble(6) : 0;
					Double latitudI = !c.isNull(7) ? c.getDouble(7) : 0;
					Double latitudF = !c.isNull(8) ? c.getDouble(8) : 0;
					Double longitudI = !c.isNull(9) ? c.getDouble(9) : 0;
					Double longitudF = !c.isNull(10) ? c.getDouble(10) : 0;
					String fechaAlta = !c.isNull(11) ? c.getString(11) : "";
					String lado = !c.isNull(12) ? c.getString(12) : "";
					String clasf = !c.isNull(13) ? c.getString(13) : "";
					String obs = !c.isNull(14) ? c.getString(14) : "";
					Long estado = !c.isNull(15) ? c.getLong(15) : 0;
					String valor1 = !c.isNull(16) ? c.getString(16) : "";
					String valor2 = !c.isNull(17) ? c.getString(17) : "";
					String valor3 = !c.isNull(18) ? c.getString(18) : "";
					String valor4 = !c.isNull(19) ? c.getString(19) : "";
					String valor5 = !c.isNull(20) ? c.getString(20) : "";
					String nombreTmo = !c.isNull(21) ? c.getString(21) : "";

					elemento = new ElementoVial();

					elemento.setIdElev(idEv);
					// evento.setIdDipEven(idDipEven);
					elemento.setNumeroRta(numeroRuta);
					elemento.setIdTmo(idTmo);
					elemento.setIdCces(idCces);
					elemento.getTipo().setIdTpoEV(tipo);
					elemento.setProgresivaIniElev(progI);
					elemento.setProgresivaFinElev(progF);
					elemento.setLatitudinielev(latitudI);
					elemento.setLatitudfinelev(latitudF);
					elemento.setLongitudinielev(longitudI);
					elemento.setLongitudfinelev(longitudF);
					elemento.setFechaaltaelev(fechaAlta);
					elemento.setLadoelev(lado);
					elemento.setClasificacionelev(clasf);
					elemento.setObservacion(obs);
					elemento.setEstadoelev(estado);
					elemento.setValordin1elev(valor1);
					elemento.setValordin2elev(valor2);
					elemento.setValordin3elev(valor3);
					elemento.setValordin4elev(valor4);
					elemento.setValordin5elev(valor5);
					elemento.getTramo().setNombreTmo(nombreTmo);

					listaElementos.add(elemento);
				} while (c.moveToNext());
			}
			c.close();
			db.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return listaElementos;
	}

}
